import ctypes  # 导入ctypes库，用于与Windows系统交互，如设置任务栏图标
import sys  # 导入系统模块，用于访问与Python解释器相关的变量和函数
import time  # 导入时间模块，用于计时操作
import traceback  # 导入追踪异常信息模块
from PyQt5.QtGui import QFont, QPixmap, QIcon  # 导入QtGui模块中的字体、像素图、图标类
from PyQt5.QtWidgets import *  # 导入所有QtWidgets模块中的类
from PyQt5.QtCore import Qt  # 导入QtCore模块中的核心类，如窗口属性设置

from app.log.exception_handling import ExceptionHanding, send_error_msg  # 自定义异常处理模块
from app.ui.Icon import Icon  # 自定义图标模块
from app.DataBase import close_db  # 数据库关闭操作模块
from app.log import logger  # 日志模块
from app.ui import mainview  # 主界面视图模块
from app.ui.tool.pc_decrypt import pc_decrypt  # PC端解密模块
from app.config import version, SEND_LOG_FLAG  # 应用版本和日志发送标志配置

widget = None  # 初始化全局窗口对象为None

# 定义全局异常处理函数
def excepthook(exc_type, exc_value, traceback_):
    error_message = ExceptionHanding(exc_type, exc_value, traceback_)  # 封装异常信息
    txt = '您可添加QQ群发送log文件以便解决该问题'  # 提示文字
    msg = f"Exception Type: {exc_type.__name__}\nException Value: {exc_value}\ndetails: {error_message}\n\n{txt}"  # 构建错误消息
    if SEND_LOG_FLAG:  # 根据配置决定是否发送错误日志
        send_error_msg(msg)
    logger.error(f'程序发生了错误:\n\n{msg}')  # 记录错误日志
    # 创建错误提示对话框
    error_box = QMessageBox()
    error_box.setWindowTitle("未知错误")  # 设置对话框标题
    pixmap = QPixmap(Icon.logo_ico_path)  # 加载图标像素图
    icon = QIcon(pixmap)  # 创建图标对象
    error_box.setWindowIcon(icon)  # 设置对话框图标
    error_box.setText(msg)  # 设置对话框文本
    error_box.setIcon(QMessageBox.Critical)  # 设置图标类型为严重错误
    error_box.addButton(QMessageBox.Ok)  # 添加确认按钮
    error_box.exec_()  # 显示对话框
    sys.__excepthook__(exc_type, exc_value, traceback_)  # 调用原始异常处理器

# 设置系统异常处理钩子
sys.excepthook = excepthook

# 设置当前进程的AppUserModelID，用于Windows任务栏图标识别
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("WeChatReport")
# 启用高DPI缩放和高清图像
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True)

# 视图控制器类
class ViewController(QWidget):
    def __init__(self):
        super().__init__()
        self.viewMainWindow = None  # 初始化主窗口对象为None
        self.viewDecrypt = None  # 初始化解密界面对象为None

    # 加载解密界面视图
    def loadPCDecryptView(self):
        self.viewDecrypt = pc_decrypt.DecryptControl()
        self.viewDecrypt.DecryptSignal.connect(self.show_success)
        self.viewDecrypt.show()

    # 加载主界面视图
    def loadMainWinView(self, username=None):
        username = ''  # 确保username参数为空字符串
        start = time.time()  # 记录加载开始时间
        self.viewMainWindow = mainview.MainWinController(username=username)
        self.viewMainWindow.exitSignal.connect(self.close)
        try:
            self.viewMainWindow.setWindowTitle(f"留痕-{version}")  # 设置主窗口标题
            self.viewMainWindow.show()  # 显示主窗口
            end = time.time()  # 记录加载结束时间
            self.viewMainWindow.init_ui()  # 初始化UI
            print('ok', '本次加载用了', end - start, 's')  # 打印加载耗时
        except Exception as e:
            print(f"Exception: {e}")
            logger.error(traceback.format_exc())

    # 展示解密成功提示框
    def show_success(self):
        QMessageBox.about(self, "解密成功", "数据库文件存储在\napp/DataBase/Msg\n文件夹下")

    # 关闭应用并关闭数据库连接
    def close(self) -> bool:
        close_db()
        return super().close()

# 主程序入口
if __name__ == '__main__':
    app = QApplication(sys.argv)  # 创建应用程序实例
    font = QFont('微软雅黑', 12)  # 设置默认字体为微软雅黑，大小12
    app.setFont(font)  # 应用字体设置
    view = ViewController()  # 实例化视图控制器
    widget = view.viewMainWindow  # 设置全局窗口对象
    try:
        # 直接加载主界面，注释掉了加载解密界面的代码
        view.loadMainWinView()
        sys.exit(app.exec_())  # 启动事件循环，等待应用结束
    except Exception as e:
        print(f"Exception: {e}")
        logger.error(traceback.format_exc())  # 记录未被捕获的异常